// PR sanitizer/65583
// { dg-do compile }
// { dg-options "-std=c++11 -fsanitize=undefined -Wno-return-type" }

namespace std
{
  inline namespace __cxx11
  {
  }
  template < typename > class allocator;
    template < class _CharT > struct char_traits;
  namespace __cxx11
  {
    template < typename _CharT, typename _Traits =
      char_traits < _CharT >, typename _Alloc =
      allocator < _CharT > >class basic_string;
    typedef basic_string < char >string;
  }
}
namespace std
{
  template < typename _Tp, _Tp __v > struct integral_constant
  {
    static constexpr _Tp value = __v;
  };
  typedef integral_constant < bool, true > true_type;
}
namespace __gnu_cxx
{
  template < typename _Tp > class new_allocator
  {
  public:
    typedef long unsigned size_type;
    typedef _Tp value_type;
      template < typename _Tp1 > struct rebind
    {
      typedef new_allocator < _Tp1 > other;
    };
  };
}
namespace std
{
  template < typename _Tp > using __allocator_base =
    __gnu_cxx::new_allocator < _Tp >;
  template < typename _Tp > class allocator:public __allocator_base < _Tp >
  {
  };
  template < typename _Alloc, typename _Tp > class __alloctr_rebind_helper
  {
    template < typename _Alloc2, typename _Tp2 >
      static constexpr true_type _S_chk (typename _Alloc2::template rebind <
					 _Tp2 >::other *);
  public:
    using __type = decltype (_S_chk < _Alloc, _Tp > (nullptr));
  };
  template < typename _Alloc, typename _Tp, bool =
    __alloctr_rebind_helper < _Alloc,
    _Tp >::__type::value > struct __alloctr_rebind;
  template < typename _Alloc, typename _Tp > struct __alloctr_rebind <_Alloc,
    _Tp, true >
  {
    typedef typename _Alloc::template rebind < _Tp >::other __type;
  };
  template < typename _Alloc > struct allocator_traits
  {
    typedef typename _Alloc::value_type value_type;
    static value_type *_S_pointer_helper (...);
    typedef decltype (_S_pointer_helper ((_Alloc *) 0)) __pointer;
    typedef __pointer pointer;
      template < typename _Tp >
      static typename _Tp::size_type _S_size_type_helper (_Tp *);
    typedef decltype (_S_size_type_helper ((_Alloc *) 0)) __size_type;
    typedef __size_type size_type;
      template < typename _Tp > using rebind_alloc =
      typename __alloctr_rebind < _Alloc, _Tp >::__type;
  };
}
namespace __gnu_cxx
{
  template < typename _Alloc > struct __alloc_traits:std::allocator_traits <
    _Alloc >
  {
    typedef std::allocator_traits < _Alloc > _Base_type;
      template < typename _Tp > struct rebind
    {
      typedef typename _Base_type::template rebind_alloc < _Tp > other;
    };
  };
}
namespace std
{
  namespace __cxx11
  {
    template < typename _CharT, typename _Traits,
      typename _Alloc > class basic_string
    {
      typedef typename __gnu_cxx::__alloc_traits < _Alloc >::template rebind <
	_CharT >::other _Char_alloc_type;
      typedef __gnu_cxx::__alloc_traits < _Char_alloc_type > _Alloc_traits;
      typedef _Char_alloc_type allocator_type;
      typedef typename _Alloc_traits::size_type size_type;
      typedef typename _Alloc_traits::pointer pointer;
      struct _Alloc_hider:allocator_type
      {
	_Alloc_hider (pointer __dat, const _Alloc & __a)
	{
	}
      };
      _Alloc_hider _M_dataplus;
      union
      {
	size_type _M_allocated_capacity;
      };
      pointer _M_local_data ()
      {
      }
      void _M_dispose ()
      {
	_M_destroy (_M_allocated_capacity);
      }
      void _M_destroy (size_type __size) throw ()
      {
      }
    public:
    basic_string (const _CharT * __s, const _Alloc & __a = _Alloc ()):_M_dataplus (_M_local_data (),
		   __a)
      {
	_M_dispose ();
      }
    };
  }
  class FileHandle
  {
    std::string fname;
    FileHandle (const char *fname);
  };
  FileHandle::FileHandle (const char *fname):fname (fname)
  {
  }
}
